#include "EditClient.h"
#include "ui_editclient.h"

namespace Ui {
class EditClient;
}

extern QSqlDatabase enjoylifedb;
extern ClientSqlTableModel *client_model;
extern QTableView *client_view;

EditClient::EditClient(QWidget *parent) :
    QWidget(parent),
    m_model(new ClientSqlTableModel(this)),
    ui(new Ui::EditClient)
{
    ui->setupUi(this);

    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);

    m_model->setTable("cliente");

    ui->razon_social->setFocus();

    ui->open_btn->setToolTip("Carga una imagen desde el ordenador.");
    ui->cleanImg_btn->setToolTip("Borra la imagen cargada.");

    connect(ui->open_btn,SIGNAL(clicked()),this,SLOT(OpenImgFile()));
    connect(ui->cleanImg_btn,SIGNAL(clicked()),this,SLOT(ResetIMG()));
    connect(ui->cancel_btn,SIGNAL(clicked()),this,SLOT(CancelButton()));
    connect(ui->save_btn,SIGNAL(clicked()),this,SLOT(SaveButton()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(SaveButton()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

EditClient::~EditClient()
{
    delete ui;
}

void EditClient::GetClientInfo(int i)
{
    row = i;
    ui->nro_cliente->setText(client_model->index(i, 0).data().toString());
    ui->razon_social->setText(client_model->index(i, 1).data().toString());
    persona = client_model->index(i, 1).data().toString();
    ui->responsable->setText(client_model->index(i, 2).data().toString());
    ui->cuit_cuil->setText(client_model->index(i, 18).data().toString());
    ui->comboBox_iva->setCurrentText(client_model->index(i, 20).data().toString());
    QImage* pixmap = new QImage();
    pixmap->loadFromData(QByteArray::fromBase64(client_model->index(i, 3).data().toByteArray()));

    QImage other = pixmap->scaled(QSize(90,80),Qt::IgnoreAspectRatio);

    ui->logo_cliente->setPixmap(QPixmap::fromImage(other));
    ui->fecha_alta->setDate(client_model->index(i, 4).data().toDate());
    ui->calle->setText(client_model->index(i, 5).data().toString());
    ui->numero->setText(client_model->index(i, 6).data().toString());
    ui->piso->setText(client_model->index(i, 7).data().toString());
    ui->dpto->setText(client_model->index(i, 8).data().toString());
    ui->barrio->setText(client_model->index(i, 9).data().toString());
    ui->ciudad->setText(client_model->index(i, 10).data().toString());
    ui->provincia->setText(client_model->index(i, 11).data().toString());
    if (client_model->index(i, 12).data().toString() == "Fijo") {
        ui->fijo1->setChecked(true);
    }
    if (client_model->index(i, 12).data().toString() == "Movil") {
        ui->movil1->setChecked(true);
    }
    ui->telefono_1->setText(client_model->index(0, 13).data().toString());
    if (client_model->index(i, 14).data().toString() == "Fijo") {
        ui->fijo2->setChecked(true);
    }
    if (client_model->index(i, 14).data().toString() == "Movil") {
        ui->movil2->setChecked(true);
    }
    ui->telefono_2->setText(client_model->index(i, 15).data().toString());
    ui->email_1->setText(client_model->index(i, 16).data().toString());
    ui->email_2->setText(client_model->index(i, 17).data().toString());
//    ui->usuario_cpanel->setText(client_model->index(i, 18).data().toString());
//    ui->contrasenia_cpanel->setText(client_model->index(i, 19).data().toString());
//    ui->registrante_nic->setText(client_model->index(i, 20).data().toString());
//    ui->email_registrante_nic->setText(client_model->index(i, 21).data().toString());
}

void EditClient::OpenImgFile()
{
    QString img_file = QFileDialog::getOpenFileName(this,"Abrir archivo de imagen",QDir::currentPath());

    if (! img_file.isEmpty()) {
        QImage image(img_file);
        if (image.isNull()) {
            QMessageBox::critical(this,"Error al abrir",
                                  "No se puede leer el archivo seleccionado");
            return;
        }
        ui->logo_cliente->setPixmap(QPixmap::fromImage(image));
    }
}

/**
 * @brief EditClient::ResetIMG
 */
void EditClient::ResetIMG()
{
    ui->logo_cliente->setPixmap(QPixmap("://Icons/UserImage02.png", "png"));
}

void EditClient::CancelButton()
{
    enjoylifedb.transaction();
    if (!(client_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    hide();
    close();
}

void EditClient::SaveButton()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Cliente"),
                                   "¿Está seguro que quiere guardar los cambios"
                                   "realizados al cliente " + ui->razon_social->text() + "?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        QString filter = "nro_cliente = '" + ui->nro_cliente->text() + "'";
        client_model->setFilter(filter);
        enjoylifedb.transaction();
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.commit();
        if (client_model->rowCount() == 1) {
            QSqlRecord record = client_model->record(0);

            if (ui->razon_social->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Razón Social no puede ser vacío");
                return;
            } else
                record.setValue("razon_social", ui->razon_social->text());

            if (ui->responsable->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Responsable no puede ser vacío");
                return;
            } else
                record.setValue("responsable", ui->responsable->text());

            QByteArray baPhoto;
            QBuffer buffer(&baPhoto);
            buffer.open(QBuffer::WriteOnly);
            if (ui->logo_cliente->pixmap()->save(&buffer, "png")) {
                record.setValue("logo_cliente", baPhoto.toBase64());
            } else {
                QMessageBox::critical(this,"ERROR!", tr("No se pudo guardar la imagen. '%1'"
                                     "intente de nuevo.").arg(buffer.errorString()));
                return;
            }

            if (ui->fecha_alta->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Fecha de Alta no puede ser vacío");
                return;
            } else
                record.setValue("fecha_alta", ui->fecha_alta->text());

            if (ui->calle->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Calle no puede ser vacío");
                return;
            } else
                record.setValue("calle", ui->calle->text());

            if (ui->numero->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Número no puede ser vacío");
                return;
            } else
                record.setValue("numero", ui->numero->text());

            record.setValue("piso", ui->piso->text());
            record.setValue("dpto", ui->dpto->text());
            record.setValue("barrio", ui->barrio->text());

            if (ui->ciudad->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Ciudad no puede ser vacío");
                return;
            } else
                record.setValue("ciudad", ui->ciudad->text());

            if (ui->provincia->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Provincia no puede ser vacío");
                return;
            } else
                record.setValue("provincia", ui->provincia->text());

            if (ui->fijo1->isChecked())
                record.setValue("tipo_tel_1", "Fijo");
            if (ui->movil1->isChecked())
                record.setValue("tipo_tel_1", "Movil");
            record.setValue("telefono_1", ui->telefono_1->text());
            if (ui->fijo2->isChecked())
                record.setValue("tipo_tel_2", "Fijo");
            if (ui->movil2->isChecked())
                record.setValue("tipo_tel_2", "Movil");
            record.setValue("telefono_2", ui->telefono_2->text());

            record.setValue("email_1", ui->email_1->text());
            record.setValue("email_2", ui->email_2->text());

            record.setValue("cuit_cuil", ui->cuit_cuil->text());

            if (!(ui->comboBox_iva->currentIndex() == 0)) {
                record.setValue("iva", ui->comboBox_iva->currentText());
            }
//            record.setValue("usuario_cpanel", ui->usuario_cpanel->text());
//            record.setValue("contrasenia_cpanel", ui->contrasenia_cpanel->text());
//            record.setValue("registrante_nic", ui->registrante_nic->text());
//            record.setValue("email_registrante_nic", ui->email_registrante_nic->text());

//            // Setea NULL los campos vacios
//            QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
//            QString stm2 = "";
//            bool control;
//            for (int i = 0; i < 11; ++i) {
//                control = false;
//                switch (i) {
//                case 0:
//                    // piso
//                    if (ui->piso->text().isNull()) {
//                        control = true;
//                        stm2 = "update cliente set piso = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 1:
//                    // dpto
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set dpto = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 2:
//                    // barrio
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set barrio = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 3:
//                    // telefono_1
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set telefono_1 = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 4:
//                    // telefono_2
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set telefono_2 = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 5:
//                    // email_1
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set email_1 = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 6:
//                    // email_2
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set email_2 = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 7:
//                    // usuario_cpanel
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set usuario_cpanel = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 8:
//                    // contrasenia_cpanel
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set contrasenia_cpanel = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 9:
//                    // registrante_nic
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set registrante_nic = NULL where nro_cliente = '";
//                    }
//                    break;
//                case 10:
//                    // email_registrante_nic
//                    if (ui->piso->text().isEmpty()) {
//                        control = true;
//                        stm2 = "update cliente set email_registrante_nic = NULL where nro_cliente = '";
//                    }
//                    break;
//                }

//                if (control) {
//                    stm2.append(ui->nro_cliente->text()).append("'");
//                    enjoylifedb.transaction();
//                    if (! query2->exec(stm2)) {
//                        QMessageBox::critical(this,"Error!", "Error al actualizar los resgistros, "
//                                              "intentelo nuevamente || " + query2->lastError().text());
//                        enjoylifedb.rollback();
//                        return;
//                    }
//                    enjoylifedb.commit();
//                }
//            }

            client_model->setRecord(0, record);
            enjoylifedb.transaction();
            if (!m_model->submitAll()) {
                QString error = m_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            // Se edita tabla persona con el cambio realizado en cliente.
            enjoylifedb.transaction();
            QSqlQuery *query = new QSqlQuery(enjoylifedb);
            QString stm = "update persona set persona = '" + ui->razon_social->text() + "' where persona = '" + persona + "'";
            if (! query->exec(stm)) {
                QMessageBox::critical(this,"Error!", "No se pudo ingresar el cambio como una persona, "
                                      "intentelo nuevamente || " + query->lastError().text());
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            enjoylifedb.commit();
        }
        else {
            QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos del cliente, intentelo de nuevo."));
            enjoylifedb.rollback();
        }
    }
    else
        return;

    UpdateClientList();
    CorrectViewOfModel();
    close();
}

/*
 * Lanzamiento de la acción de actualizar la lista de clientes manualmente.
 */
void EditClient::UpdateClientList()
{
    QString filtro = "estado is null";
    client_model->setTable("cliente");
    client_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!(client_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModel();
}

/*
 *  Organiza de manera adecuada la vista del modulo cliente
 */
void EditClient::CorrectViewOfModel()
{
    client_model->setHeaderData(0, Qt::Horizontal, "Nro. Cliente");
    client_model->setHeaderData(1, Qt::Horizontal, "Razón Social");
    client_model->setHeaderData(2, Qt::Horizontal, "Responsable");
    client_model->setHeaderData(4, Qt::Horizontal, "Fecha Alta");
    //    client_model->setHeaderData(5, Qt::Horizontal, "Calle");
    //    client_model->setHeaderData(6, Qt::Horizontal, "Nro.");
    //    client_model->setHeaderData(7, Qt::Horizontal, "Piso");
    //    client_model->setHeaderData(8, Qt::Horizontal, "Depto.");
    //    client_model->setHeaderData(9, Qt::Horizontal, "Barrio");
    //    client_model->setHeaderData(10, Qt::Horizontal, "Ciudad");
    //    client_model->setHeaderData(11, Qt::Horizontal, "Provincia");
    client_model->setHeaderData(12, Qt::Horizontal, "Tipo Tel.");
    client_model->setHeaderData(13, Qt::Horizontal, "Telefono");
    client_model->setHeaderData(14, Qt::Horizontal, "Tipo Tel.");
    client_model->setHeaderData(15, Qt::Horizontal, "Tel. Altern.");
    client_model->setHeaderData(16, Qt::Horizontal, "E-mail");
    client_model->setHeaderData(17, Qt::Horizontal, "E-mail Altern.");
    //    client_model->setHeaderData(18, Qt::Horizontal, "Usuario cpanel");
    //    client_model->setHeaderData(19, Qt::Horizontal, "Pass cpanel");
    //    client_model->setHeaderData(20, Qt::Horizontal, "Registrante NIC");
    //    client_model->setHeaderData(21, Qt::Horizontal, "E-mail Regist. NIC");
    //    client_model->setHeaderData(22, Qt::Horizontal, "Fecha Alta NIC");
    //    client_model->setHeaderData(23, Qt::Horizontal, "Fecha Vto. NIC");

    // Vista del modelo definido anteriormente
    client_view->setModel(client_model);
    client_view->sortByColumn(0, Qt::SortOrder());
    client_view->setSortingEnabled(true);
    client_view->setAlternatingRowColors(true);
    client_view->setGridStyle(Qt::SolidLine);
    client_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    client_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    client_view->hideColumn(3);
    client_view->hideColumn(5);
    client_view->hideColumn(6);
    client_view->hideColumn(7);
    client_view->hideColumn(8);
    client_view->hideColumn(9);
    client_view->hideColumn(10);
    client_view->hideColumn(11);
//    client_view->hideColumn(18);
//    client_view->hideColumn(19);
//    client_view->hideColumn(20);
//    client_view->hideColumn(21);
//    client_view->hideColumn(22);
//    client_view->hideColumn(23);
}
